#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QUrl>
#include <QPixmap>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //初始化
    manager=new QNetworkAccessManager(this);

    //关联finished(QNetworkReply *reply)
    connect(manager,SIGNAL(finished(QNetworkReply *)),this,SLOT(fun(QNetworkReply *)));
}

MainWindow::~MainWindow()
{
    delete ui;
}

//获取网络天气信息
void MainWindow::on_pushButton_clicked()
{
    //单行输入框获取天气预报的网址
    QString urlstr=ui->lineEdit->text();
    //创建QUrl对象
    QUrl url(urlstr);

    //准备http请求
    QNetworkRequest *request=new QNetworkRequest(url);

    //发送该请求
    manager->get(*request);
}
//跟finished信号对应的槽函数，用来接收http服务器的应答信息
void MainWindow::fun(QNetworkReply *reply)
{
    //接收应答信息:由于此例子我是获取天气预报，服务器回复的应答信息就是天气预报信息
    QByteArray buf=reply->readAll(); //buf里面存放的就是天气预报数据
    //在文本浏览框显示天气信息
    //ui->textBrowser->setText(buf);

    //第一步：把json数据规格化存储
    QJsonDocument jsondoc=QJsonDocument::fromJson(buf);

    //第二步：严格按照肉眼观察到json数据结构，一层层剥洋葱从外到内解析
    //获取最外层对象
    QJsonObject obj1=jsondoc.object();

    //解析obj1里面的键"current_condition"对应的值
    /*
        QJsonValue表示值：类里面提供大量的toxxx方法
           toInt
           toDouble
           toBool
           toObject
           toArray
        原因：json数据键一定是字符串，但是值可能是任何合法数据类型
             QT提供了转换类型的方法，方便程序员把QJsonValue转成实际需要的类型
    */
    QJsonValue val1=obj1.value("current_condition");

    //val1是个数组，它里面放了一个对象
    QJsonArray array1=val1.toArray();

    //搞定array1里面的那个对象
    QJsonValue val2=array1.at(0); //得到数组第一个元素
    //观察发现数组元素也是个对象
    QJsonObject obj2=val2.toObject();

    //搞定obj2里面键"FeelsLikeC"对应的值
    QJsonValue val3=obj2.value("FeelsLikeC");
    qDebug()<<"FeelsLikeC对应的值: "<<val3.toString();
}
